//package com.lb.bs.client.adapter.spring;
//
//import com.lb.bs.client.adapter.cache.LBCache;
//import com.lb.bs.client.annotation.LBItem;
//import com.lb.bs.client.enums.StateEnum;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//
//import java.util.concurrent.atomic.AtomicBoolean;
//import java.util.concurrent.atomic.AtomicReference;
//
///**
// * program: LB-BS-Client
// * author: bsworld.xie
// * create: 2019-11-27 19:57
// * description:
// */
//@Aspect
//public class LBAspect {
//
//    private static final Logger logger = LoggerFactory.getLogger(LBAspect.class);
//
//    private static final int waitLbStartMillionSeconds = 10;
//
//    private AtomicBoolean waitFlag = new AtomicBoolean(false);
//
//    @Pointcut(value = "execution (public * *(..))")
//    public void anyPublicMethod() {
//
//    }
//
//    public LBAspect() {
//        logger.info("LBAspect constructor");
//    }
//
//    @Around(value = "anyPublicMethod() && @annotation(lbItem)")
//    public Object aroundItem(ProceedingJoinPoint pjp, LBItem lbItem) {
//        logger.info("invoke, item:{}", lbItem);
//        ensureWait();
//
//        try {
//            Object cacheVal = LBCache.getCacheVal(pjp.getSignature().getDeclaringType(), lbItem);
//            if (cacheVal != null) {
//                return cacheVal;
//            }
//            return pjp.proceed();
//        } catch (Throwable throwable) {
//            logger.error("LBAspect.class, aroundItem(), lbItem:{}, error:", lbItem, throwable);
//        }
//        return null;
//    }
//
//
//    private void ensureWait() {
//        if (waitFlag.get()) {
//            return;
//        }
//        boolean wait = waitFlag.compareAndSet(false, true);
//        if (!wait) {
//            return;
//        }
//        AtomicReference initFlag = LBSecondBean.initFlag;
//        if (!StateEnum.STARTING.equals(initFlag)) {
//            return;
//        }
//        long initTime = System.currentTimeMillis();
//        long nowTime = initTime;
//        while (nowTime - initTime < waitLbStartMillionSeconds) {
//            nowTime = System.currentTimeMillis();
//        }
//    }
//
//
//}
